/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.english.pojj.gui_obr;

import java.awt.BorderLayout;
import java.awt.Point;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.File;

import java.net.URI;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;



/*******************************************************************************
 * Instance třídy {@code GUI_OBR_0} přestavují grafické aplikace
 * pro testování práce s grafikou, obrázky a posluchači událostí.
 * <p>
 * Tato verze ukazuje pouze tři obrázky a nemá ještě žádnou nabídku.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000,  0.0.2006
 */
public class GUI_OBR_0
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Souřadnice, na které se aplikační okno přesune po spuštění GUI.
     *  To má smysl především při zobrazování na sekundárním monitoru. */
    private static final Point POINT_0 = new Point(0, 0);       //(-600, 0);



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

    /** Složka, ve které se nacházejí soubory s obrázky. V této verzi
     *  je sice konstantní, ale v dalších ji umožníme nastavovat.  */
    private static String názevSložkyZdrojů;



//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================

    static {
        Class<?> cls = GUI_OBR_0.class;
        URL url = cls.getResource("OBR");
        URI uri;
        try {
            uri = url.toURI();
        } catch (Exception e) {
            throw new RuntimeException("Nepodařilo se otevřít složku třídy",e);
        }
        File složkaZdrojů = new File(uri);
        try {
            názevSložkyZdrojů = složkaZdrojů.getCanonicalPath() + "/";
        }catch(Exception ex) {
            throw new RuntimeException(
                    "Nepodařilo se zjistit kanonické jméno",ex);
        }
//        //Tělo statického bloku komprimované do jediného příkazu
//        //obaleného try-catch blokem
//        try {
//            názevSložkyZdrojů =
//                new File(GUI_OBR_4.class.getResource("").toURI()).
//                getCanonicalPath() + "\\";
//        }catch(Exception ex) {
//            throw new RuntimeException(
//                    "Nepodařilo se připravit složky se zdroji",ex);
//        }
    }



//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Aplikační okno. */
    private final JFrame frmOkno =
            new JFrame("Práce se soubory a obrázky - verze 0");



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    //Následující atributy jsou sice také konstantní,
    //ale budu-li je daklarovat jako proměnné,
    //nebudu je muset všechny inicializovat v konstruktoru
    //Toho využiji v příštích verzích, až bude GUI složitější.

    private JLabel    lblObrázek;   //Návěští zobrazující vykreslovaný obrázek

    private Icon      icoChyba;     //Obrázek chyby
    private Icon      icoVlastnost; //Obrázek vlastnosti
    private Icon      icoNevím;     //Obrázek otazníku

    private JButton   btnChyba;     //Tlačítko pro obrázek chyby
    private JButton   btnVlastnost; //Tlačítko pro obrázek vlastnosti
    private JButton   btnNevím;     //Tlačítko pro obrázek otazníku
    private JButton   btnNic;       //Tlačítko zavřená panelu obrázků



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří instanci aplikace přičemž konstruktor vše zařizuje sám.
     */
    public GUI_OBR_0()
    {
        //Následující posunutí má smysl pouze tehdy,
        //cheme-li aplikační okno zobrazit na sekundárním monitoru
        frmOkno.setLocation(POINT_0);

        frmOkno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        připraPanely();             //Připrav jednotlivé panely

        //Aktivace aplikačního okna
        frmOkno.pack();             //Optimalizuje velikost vytvořeného okna
        frmOkno.setVisible(true);   //a zviditelní je
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Připraví jednotlivé panely aplikačního okna
     */
    private void připraPanely()
    {
        //Výzva u horního okraje
        frmOkno.add(new JLabel("Který obrázek chceš vidět?"),
                    BorderLayout.NORTH);

        //Obrázky, které se budou zobrazovat ve středu
        icoChyba     = new ImageIcon(názevSložkyZdrojů + "Chyba.png");
        icoVlastnost = new ImageIcon(názevSložkyZdrojů + "Vlastnost.png");
        icoNevím     = new ImageIcon(názevSložkyZdrojů + "Nevím.png");

        lblObrázek   = new JLabel();
        frmOkno.add(lblObrázek, BorderLayout.CENTER);

        //Tlačítka umisťovaná u spodního okjraje
        btnChyba     = new JButton("Chyba");
        btnVlastnost = new JButton("Vlastnost");
        btnNevím     = new JButton("Nevím");
        btnNic       = new JButton("Nic");

        //Border layout dovoluje umístit do každé zóny jedinou komponentu
        //Tlačítek je více => potřebujeme je umístit do panelu
        JPanel panel = new JPanel();
        panel.add(btnChyba);
        panel.add(btnVlastnost);
        panel.add(btnNevím);
        panel.add(btnNic);
        frmOkno.add(panel, BorderLayout.SOUTH);

        //Všechna talčítka mají společného posluchače
        ActionListener posluchač = new PosluchačTlačítka();
        btnChyba     .addActionListener(posluchač);
        btnVlastnost .addActionListener(posluchač);
        btnNevím     .addActionListener(posluchač);
        btnNic       .addActionListener(posluchač);
    }



//== INTERNÍ DATOVÉ TYPY =======================================================

    /***************************************************************************
     * Instance třídy PosluchačTlačítka představuje společného posluchače
     * všech tlačítek.
     * Je definována jako vnitřní, abychom mohli používat atributy instance.
     */
    private class PosluchačTlačítka implements ActionListener
    {
        /***********************************************************************
         * {@inheritDoc}
         * @param e Očekávaná událost
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            //Zjistím název toho, kdo mne volal
            String zdroj = e.getActionCommand();

            //A porovnám jej s texty na tlačítcích
            if(zdroj.equals(btnChyba.getText())) {
                lblObrázek.setIcon(icoChyba);
            }
            else if(zdroj.equals(btnVlastnost.getText())) {
                lblObrázek.setIcon(icoVlastnost);
            }
            else if(zdroj.equals(btnNevím.getText())) {
                lblObrázek.setIcon(icoNevím);
            }
            else if(zdroj.equals(btnNic.getText())) {
                lblObrázek.setIcon(new ImageIcon());
            }
            else {
                throw new RuntimeException("Neznámá událost");
            }
            //Obrázek mohl změnit velikost okna => musím ji aktualizovat
            frmOkno.pack();
        }
    }



//== TESTOVACÍ METODY A TŘÍDY ==================================================

    /***************************************************************************
     * Testovací metoda.
     */
     public static void test() {
         new GUI_OBR_0();
     }


    /***************************************************************************
     * @param args Parametry příkazového řádku - nepoužívají se */
     public static void main(String[] args)  {  test();  }
}
